package sparkCore

import org.apache.spark.{SparkConf, SparkContext}

object HelloSpark {
  def main(args: Array[String]): Unit = {

    //spark 编程
    //rdd 弹性分布式数据集  类似于array ， 操作的是数据集

    /*
    * 环境：1） 运行模式：本地模式、yarn-client，yarn-cluster  配置 Windows选本地模式，
    *  配置项 要用 sparkConf ，
    *  任务 SparkConf里的appName来设置
    *  设置 内存
    *     2） SparkContext  SC（spark客户端） 提交job任务
    *     3） spark基于内存，跑的数据，如果宕机（包括无网络）就没了
    *     4） 依赖 spark core
     */

   //词频统计
    val conf = new SparkConf().setMaster("local[*]").setAppName("hello spark") //conf是spark的配置
    val sc = new SparkContext(conf)  //conf是配置，sc是SparkContext的返回对象，必须有sc构建它的程序

   //构建了数组 数据
    val arr = Array("hello world","hello java","hello spark")
    val arrnew = sc.parallelize(arr)  //将数据转化成rdd
    //data:"hello world","hello java","hello spark"

    val obj = arrnew.flatMap( x => x.split(" "))  //hello world hello java
    //flatMap   x => x.split(" ")  匿名函数 , 将每个元素空格进行切分  ((hello,world),(hello,java),(hello,spark))
    //flatMap   切分 压平 hello,world,heollo,java,hellp,spark  一个一个
    //obj 变成一个一个词的形式

    /**  1.函数方法
     *  def hello(name:string,age:int) ={
     *       函数体
     *       println("111")
     * }
     *   2.缩写简写
     *   def hello(name:string,age:int) = println("111")
     *    3.
     *      (name:string,age:int) => println("111")
     *      4.
     *        (name,age) => println("111")
     *
     *
     */


    val obj1 = obj.map(x => (x,1))   //(hello,1)  (world,1)  (hello,1)
    //obj
    //map x=> (x,1) 匿名函数 映射的作用
    //map (hello,1) (world,1) (hello,1) (java,1)
    //obj1 (key,1)

    val obj2 = obj1.reduceByKey((x,y) => x+y )   //(hello,3)  (world,1)
    //匿名函数 (x,y) => x+y 把相同的 key 值，value 进行相加
    //reduceByKey 按照key进行分组
    //obj2 (hello,3) (java,1) (spark,1)



    obj2.foreach(    x =>{ println(x) }  )  //{}可去掉
    // foreach 循环打印
    //(hello,3)
    //(java,1)
    //(spark,1)


  }

}
